home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / ax3.00 / filecopy.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-03  |  2.1 KB  |  82 lines

  1. #include "bbs.h"
  2.  
  3. static ULONG GetFileSize(char *s);
  4. /****************************************************************************\
  5.                                  DynAllocate
  6. \****************************************************************************/
  7.  
  8. ULONG DynAllocate(char **pbuf,ULONG maxbufsize)
  9. {
  10.  /* first try Fast mem allocate */
  11.  do {
  12.         *pbuf=(char *)AllocMem((ULONG)maxbufsize,MEMF_PUBLIC|MEMF_CLEAR);
  13.         maxbufsize=maxbufsize>>1; if(*pbuf==NULL) Delay(5L);
  14.     } while(*pbuf == NULL && maxbufsize > 8192);
  15.  
  16.  maxbufsize=maxbufsize<<1;
  17.  if(*pbuf!=NULL)    return(maxbufsize);
  18.  return(0L);
  19. }
  20.  
  21.              /* s = from file, d = to file */
  22. ULONG FileCopy(char *from,char *to)
  23. {
  24.  UBYTE *buf;
  25.  long bufsize,stat1,stat2;
  26.  BPTR fhs,fhd;
  27.  //if(Rename(from,to)) return(2);
  28.  
  29.  if(bufsize=DynAllocate(&buf,GetFileSize(from)+8192L)) {
  30.       /* got a buffer full of mem */
  31.         if(fhs=Open(to,MODE_OLDFILE)) {
  32.             Close(fhs);                 /* file exists so return */
  33.          FreeMem(buf,bufsize);       
  34.             return(0);
  35.         }
  36.  
  37.         if(fhs=Open(from,MODE_OLDFILE)) {
  38.             if(fhd=Open(to,MODE_NEWFILE)) {
  39.                 do {
  40.                     stat1=Read(fhs,buf,bufsize);   /* Read from file */
  41.                     if(stat1>0)        stat2=Write(fhd,buf,stat1); /* write to file*/
  42.                 } while(stat1>0&&stat2>0);
  43.  
  44.              if(stat1<0) {
  45.                     sprintf(GSTR3,"\r\nERROR while reading from %s!\r\n",from);
  46.                  AEPutStr(GSTR3);
  47.                 }
  48.                 if(stat2<0)    {
  49.                  sprintf(GSTR3,"\r\nERROR while writing to %s!\r\n",to);
  50.                     AEPutStr(GSTR3);
  51.                 }
  52.              Close(fhd);
  53.             }
  54.             Close(fhs);
  55.         }
  56.         FreeMem(buf,bufsize);
  57.     }
  58.  
  59.  if((stat1>=0&&stat2>=0))    {
  60.     return(1);
  61.  }
  62.  return(0);
  63. }
  64.  
  65. static ULONG GetFileSize(char *s)
  66. {
  67. struct FileInfoBlock *FBlock;
  68.  BPTR FLock;
  69.   ULONG fsize=8192L;
  70.   if((FLock = Lock(s,ACCESS_READ)) == NULL) {
  71.               return(8192L);
  72.              }
  73.  
  74.              if((FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) == NULL) {
  75.                  UnLock(FLock);
  76.                  return(8192L);
  77.              }
  78.              if( Examine(FLock,FBlock) )     fsize = FBlock->fib_Size;
  79.              UnLock(FLock);
  80.              FreeDosObject(DOS_FIB,FBlock);
  81.  return(fsize);
  82. }